#pragma once

#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;   // 数据类型的别名
typedef struct LNode {   // 定义单链表结点类型
    char data;           // 数据域，存放数据元素
    struct LNode* next;  // 指针域，指向后继结点
} LNode, *LinkList;      // 定义单链表结点类型和单链表类型

// 尾插法创建带头结点的单链表，使用数组a中n个元素初始化结点，返回头指针
LinkList CreateList(char* str) {
    LinkList head = (LinkList)malloc(sizeof(LNode));  // 创建头结点
    if (!head) {
        return NULL;  // 内存分配失败，返回空指针
    }
    head->next = NULL;  // 链表初始为空表
    LinkList end = head;  // 尾指针指向最后一个结点，用于插入新结点
    for (int i = 0; str[i]; ++i) {
        LinkList node = (LinkList)malloc(sizeof(LNode));  // 创建新链表结点
        if (!node) {
            return NULL;  // 内存分配失败，返回空指针
        }
        node->data = str[i];  // 将数组a中的元素赋值给新结点的数据域
        end->next = node;  // 将新结点插入到尾结点之后
        end = node;        // 更新尾指针指向新结点
    }
    end->next = NULL;  // 尾结点的指针域置空，此句不可省
    return head;
}

// 遍历带头结点的单链表，依次输出每个结点的数据域
void PrintList(LinkList head) {
    if (!head) {
        return;  // head为空，链表不存在
    }
    for (LinkList p = head->next; p; p = p->next) {  // 遍历链表
        printf("%c", p->data);                       // 输出结点的数据域
    }
    printf("\n");
}